透過 cmdlet 所產生出來的物件所擁有的屬性很多,但是 PowerShell 是依賴預設設定和規則來決定最後輸出到螢幕上的結果,書中透過第 11 章「格式化:為何要在最後完成」中講述如何覆蓋這些預設設定,並為你的命令輸出結果建立自己的格式。
書中以 cmdlet Get-PSReadLineKeyHandler
進行解釋,當執行該指令時,他會預設呈現以下格式:
在 Windows PowerShell 5.1 及更早版本中,格式化文件( *.ps1xml)位於 $PSHOME 目錄下,然而,在 PowerShell 7 及更高版本中,這些默認的格式化文件不再以獨立的 .ps1xml 文件形式存在。相反,這些格式化定義被嵌入到程序集(DLL)中,例如 Microsoft.PowerShell.ConsoleHost.dll。
而書中所提到的這個 cmdlet 正好不屬於核心模塊並且我們可以透過檢視其 PSReadLine.format.ps1xml
的內容以了解如何查看格式化文件。
Get-PSReadLineKeyHandler
物件類型TypeName: Microsoft.PowerShell.KeyHandler
Microsoft.PowerShell.KeyHandler
在 PSReadLine.format.ps1xml
的設定PS /usr/local/microsoft/powershell/7/Modules/PSReadLine> code ./PSReadLine.format.ps1xml
紅框是整個 Microsoft.PowerShell.KeyHandler
的預設顯示方式的規則,而黃框是呈現 Table 的欄位及內容等定義。
Format-Table
(簡寫為 ft
)cmdlet 允許您將輸出格式化為表格形式,並指定要顯示的屬性。
這在需要對比多個物件的屬性時非常有用。
Get-Process
輸出Format-List
(簡寫為 fl
)cmdlet 將每個物件的屬性以清單形式顯示,適合查看單個物件的詳細資訊或當物件有大量屬性時使用。
將名為 pwsh
的進程的所有屬性以清單形式顯示。
Get-Process | Where-Object { $_.ProcessName -eq "pwsh" } | Format-List *
Format-Wide
(簡寫為 fw
)cmdlet 允許您以多欄方式顯示單一屬性的值,適合在螢幕上橫向空間充足時使用。
Get-Command
的格式Format-Wide
以三欄的方式顯示。除了在主機上顯示資料外,您還可以將資料輸出到檔案,例如文字檔、CSV、JSON 等,以便於後續處理或分享。
# 將進程列表導出為 CSV 檔案
Get-Process | Export-Csv -Path "processes.csv" -NoTypeInformation
# 將服務列表導出為文字檔案
Get-Service | Out-File -FilePath "services.txt"
# 將物件序列化為 JSON 格式
Get-Process | ConvertTo-Json | Out-File -FilePath "processes.json"
Out-GridView
cmdlet 允許您在圖形化介面中查看資料,並提供即時的篩選和排序功能。( Windows 系統才能用)
Get-Process | Out-GridView
此命令將進程列表在新的視窗中顯示,您可以在其中篩選和排序資料。
在管道中,格式化 cmdlet(如 Format-Table
、Format-List
)應該放在最後一個,因為一旦物件被格式化,它們就不再是原始物件,而是格式化後的資料塊,無法再進行物件層級的處理。
# 正確的順序
Get-Service | Where-Object { $_.Status -eq "Running" } | Format-Table Name, Status
# 錯誤的順序
Get-Service | Format-Table Name, Status | Where-Object { $_.Status -eq "Running" }
在錯誤的範例中,Where-Object
無法對格式化後的物件進行篩選。
在管道中,建議一次只處理一種類型的物件,以避免格式化或處理上的混亂。
# 建議的做法
Get-Process | Format-Table
# 不建議的做法
Get-Process; Get-Service | Format-Table
在不建議的範例中,Get-Process
和 Get-Service
產生的物件類型不同,直接一起格式化可能導致輸出結果不一致或難以閱讀。
Day 13 - 篩選與比較